package cn.dansj.common.request.annotation.http;

import cn.dansj.common.utils.crypt.Crypt;
import cn.dansj.common.utils.enums.BooleanType;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.ValueConstants;

import java.lang.annotation.*;

/**
 * 支持多级选择,需要打开iteration选项,点隔开 RequestPackage(name="a.b.c",iteration=true)
 * <p>
 * 支持的数据类型:  Map,String,List,基础数据类型,JSONObject,自定义封装对象 ...
 * <p>
 * 所有的请求类型都可以使用,相当于半整合了RequestParam、RequestBody、PathVariable(path参数开启该注解)
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
@Documented
public @interface RequestParam {
    /**
     * 是否解密
     */
    boolean decrypt() default false;

    /**
     * 加解密方法类，默认从bean中配置获取, 单独设置提供继承的Crypt类
     */
    Class<? extends Crypt> cryptClass() default Crypt.class;

    /**
     * 指定解析key 转换成List<String>一定要指定该值
     * name为空并且变量名称不在参数列表时，如果返回的是Map、JSONObject或者Collection，则无视allGet参数，会返回全部参数组成的数据映射到这个变量
     */
    @AliasFor("value")
    String name() default "";

    @AliasFor("name")
    String value() default "";

    /**
     * 参数从上下文字典中获取 name=a.b.c   参数格式 {"a":{"b":{"c":1}}}   最终结果为 1
     */
    boolean iteration() default false;

    /**
     * 参数是否必填
     */
    boolean required() default true;

    /**
     * 参数默认值
     */
    String defaultValue() default ValueConstants.DEFAULT_NONE;

    /**
     * 是否是路径变量，true相当于PathVariable注解
     */
    boolean path() default false;

    /**
     * 指定allGet为TRUE时，不判断名称是否在参数列表，而是把参数列表转换成相应的类型映射到该变量中
     * 为FALSE不进行匹配映射
     * 为UNSET时，由name决定是否映射
     */
    BooleanType allGet() default BooleanType.UNSET;
}
